package Problema;

import Controlador.CPrincipal;
import java.util.Vector;

public class todo {

    CPrincipal control;
    Vector<Vector> destinos;
    Vector<tarea> tareas;
    Vector<tracto> tractos;
    Vector<deposito> depositos;
    Vector cargaSR;
    Vector<String> subtareas;
    Vector<Vector> tramos;
    int maxHrCont, maxHrDia, maxCarga;

    public todo(CPrincipal cp) {
        this.control = cp;
    }

    public void procesarTareas() {
        this.subtareas = new Vector<String>();
        int i, cini, cfin;
        String dep;
        for(i = 0; i<this.tareas.size(); i++) {
            cini = this.tareas.get(i).getcIni();
            cfin = this.tareas.get(i).getcFin();
            if(cini > cfin) {
                dep = ((camino)this.destinos.get(cfin-1).get(cini-1-cfin)).getDeposito();
            } else {
                dep = ((camino)this.destinos.get(cini-1).get(cfin-1-cini)).getDeposito();
            }
            if(dep.compareTo("-")==0) {
                this.subtareas.add((i+1)+"+,"+(i+1)+"-");
            } else {
                this.subtareas.add((i+1)+"+,"+dep);
                this.subtareas.add(dep+","+(i+1)+"-");
            }
        }
    }

    public double getDistancia(String ini, String fin) {
        int nCiu = this.tramos.size(), id;
        int[] ciu = new int[2];
        String[] dep = new String[2];
        double r = 0;
        int i=0, j=0, nTramos;
        boolean encon = false;
        tramo aux;
        Vector<tramo> ciudad;
        id = ini.indexOf("+");
        if(id<0) {
            id = ini.indexOf("-");
            if(id<0) {
                dep[0] = ini;
                ciu[0] = -1;
            } else {
                dep[0] = "-";
                ciu[0] = Integer.parseInt(ini.substring(id-1, id));
            }
        } else {
            dep[0] = "-";
            ciu[0] = Integer.parseInt(ini.substring(id-1, id));
        }
        id = fin.indexOf("+");
        if(id<0) {
            id = fin.indexOf("-");
            if(id<0) {
                dep[1] = fin;
                ciu[1] = -1;
            } else {
                dep[1] = "-";
                ciu[1] = Integer.parseInt(fin.substring(id-1, id));
            }
        } else {
            dep[1] = "-";
            ciu[1] = Integer.parseInt(fin.substring(id-1, id));
        }
        //System.out.println("dep: "+dep[0]+" | "+dep[1]);
        //System.out.println("ciu: "+ciu[0]+" | "+ciu[1]);
        if(ciu[0]>0 && ciu[1]>0) {
            if(ciu[0]!=ciu[1]) {
                if(ciu[0] > ciu[1]) {
                    r = ((camino)this.destinos.get(ciu[1]-1).get(ciu[0]-1-ciu[1])).getDistancia();
                } else {
                    r = ((camino)this.destinos.get(ciu[0]-1).get(ciu[1]-1-ciu[0])).getDistancia();
                }
            } else {
                r = 0;
            }
            //System.out.println("distacia: "+ciu[0]+" | "+ciu[1]+": "+r);
        } else {
            int ciuIni;
            String depFin;
            if(ciu[0] < 0 && ciu[1] < 0) {
                r = 0;
                //System.out.println("distacia: "+dep[0]+" | "+dep[1]+": "+r);
            } else {
                if(ciu[0]>0) {
                    ciuIni = ciu[0];
                    depFin = dep[1];
                } else {
                    ciuIni = ciu[1];
                    depFin = dep[0];
                }
                ciudad = this.tramos.get(ciuIni-1);
                nTramos = ciudad.size();
                encon = false;
                i = 0;
                while(i<nTramos && !encon) {
                    if(ciudad.get(i).deposito.compareTo(depFin)==0) {
                        encon = true;
                        r = ciudad.get(i).getDistancia();
                    } else i++;
                }
                //System.out.println("distancia: "+ciuIni+" | "+depFin+": "+r);
            }
        }
        
        return r;
    }

    public String getCiudadTarea(String t) {
        int id = t.indexOf("+");
        int tarea;
        String r = null;
        if(id < 0) {
            id = t.indexOf("-");
            if(id < 0) {
                return t;
            } else {
                 tarea = Integer.parseInt(t.substring(id-1, id));
                 r = this.tareas.get(tarea-1).getcFin()+"-";
            }
        } else {
            tarea = Integer.parseInt(t.substring(id-1, id));
            r = this.tareas.get(tarea-1).getcIni()+"+";
        }
        //System.out.println("ciudadTarea "+t+": "+r);
        return r;
    }

    public Vector<deposito> getDepositos() {
        return depositos;
    }

    public void setDepositos(Vector<deposito> depositos) {
        this.depositos = depositos;
    }

    public Vector<Vector> getDestinos() {
        return destinos;
    }

    public void setDestinos(Vector<Vector> destinos) {
        this.destinos = destinos;
    }

    public Vector<String> getSubtareas() {
        return subtareas;
    }

    public void setSubtareas(Vector<String> subtareas) {
        this.subtareas = subtareas;
    }

    public Vector<tarea> getTareas() {
        return tareas;
    }

    public void setTareas(Vector<tarea> tareas) {
        this.tareas = tareas;
    }

    public Vector<tracto> getTractos() {
        return tractos;
    }

    public void setTractos(Vector<tracto> tractos) {
        this.tractos = tractos;
    }

    public Vector getCargaSR() {
        return cargaSR;
    }

    public void setCargaSR(Vector cargaSR) {
        this.cargaSR = cargaSR;
    }

    public tarea getTarea(int id) {
        return this.tareas.get(id-1);
    }

    public Vector<Vector> getTramos() {
        return tramos;
    }

    public void setTramos(Vector<Vector> tramos) {
        this.tramos = tramos;
    }

    public int getMaxCarga() {
        return maxCarga;
    }

    public void setMaxCarga(int maxCarga) {
        this.maxCarga = maxCarga;
    }

    public int getMaxHrCont() {
        return maxHrCont;
    }

    public void setMaxHrCont(int maxHrCont) {
        this.maxHrCont = maxHrCont;
    }

    public int getMaxHrDia() {
        return maxHrDia;
    }

    public void setMaxHrDia(int maxHrDia) {
        this.maxHrDia = maxHrDia;
    }

    
    
}
